package main

import (
	"errors"
	"fmt"
	"log"
)

// recover 和panic 练习
// 自定义myrecover来处理异常
func MyRecover() interface{} {
	e := recover()
	log.Fatal("trace....", e)
	return e
}

func foo() (err error) {
	// 根据error不同的错误类型做出不同的记录
	switch e := recover().(type) {
	case string:
		err = errors.New(e)
	case error:
		err = e
	default:
		err = fmt.Errorf("unknown panic")
	}
	fmt.Println(err)
	return
}

func main() {
	// -----------------------------------------
	// defer MyRecover() // 自定义的是可以捕获异常
	// -----------------------------------------

	// defer recover() // 这样直接是无法捕获异常的
	// -----------------------------------------
	// 可以捕获异常
	// defer func() {
	// 	if r := recover(); r != nil {
	// 		fmt.Println(r)
	// 	}
	// }()
	// -----------------------------------------
	defer foo()
	panic("11111111")

}
